package com.fl.nj.controller;

import com.fl.nj.entity.Area;
import com.fl.nj.exception.ApiResponse;
import com.fl.nj.exception.BusinessException;
import com.fl.nj.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 * 区域Controller
 * 提供RESTful API接口，供Vue前端调用
 */
@RestController
@RequestMapping("/api/areas")
public class AreaController {
    @Autowired
    private AreaService areaService;

    /**
     * 获取所有区域列表
     * 
     * @return 区域列表
     */
    @GetMapping
    public ApiResponse<List<Area>> getAll() {
        List<Area> areaList = areaService.getAll();
        return ApiResponse.success(areaList);
    }

    /**
     * 根据ID获取区域
     * 
     * @param id 区域ID
     * @return 区域对象
     */
    @GetMapping("/{id}")
    public ApiResponse<Area> getById(@PathVariable Long id) {
        Area area = areaService.getById(id);
        if (area == null) {
            throw new NoSuchElementException("区域不存在");
        }
        return ApiResponse.success(area);
    }

    /**
     * 根据区域名称获取区域
     * 
     * @param areaName 区域名称
     * @return 区域对象
     */
    @GetMapping("/name/{areaName}")
    public ApiResponse<Area> getByAreaName(@PathVariable String areaName) {
        Area area = areaService.getByAreaName(areaName);
        if (area == null) {
            throw new NoSuchElementException("区域不存在");
        }
        return ApiResponse.success(area);
    }

    /**
     * 添加区域
     * 
     * @param area 区域对象
     * @return 添加结果
     */
    @PostMapping
    public ApiResponse<Area> save(@RequestBody Area area) {
        // 可以在这里添加参数验证
        if (area.getAreaName() == null || area.getAreaName().trim().isEmpty()) {
            throw new BusinessException(400, "区域名称不能为空");
        }

        areaService.save(area);
        return ApiResponse.success(area);
    }

    /**
     * 更新区域
     * 
     * @param id   区域ID
     * @param area 区域对象
     * @return 更新结果
     */
    @PutMapping("/{id}")
    public ApiResponse<Area> update(@PathVariable Long id, @RequestBody Area area) {
        // 验证ID是否匹配
        if (area.getId() != null && !area.getId().equals(id)) {
            throw new BusinessException(400, "请求路径中的ID与请求体中的ID不匹配");
        }

        // 检查区域是否存在
        Area existingArea = areaService.getById(id);
        if (existingArea == null) {
            throw new NoSuchElementException("区域不存在");
        }

        area.setId(id);
        areaService.update(area);
        return ApiResponse.success(area);
    }

    /**
     * 删除区域
     * 
     * @param id 区域ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> delete(@PathVariable Long id) {
        // 检查区域是否存在
        Area area = areaService.getById(id);
        if (area == null) {
            throw new NoSuchElementException("区域不存在");
        }

        // 可以添加业务校验，例如：如果区域下有设备，则不允许删除
        int deviceCount = areaService.countDevices(id);
        if (deviceCount > 0) {
            throw new BusinessException(400, "该区域下有" + deviceCount + "个设备，不允许删除");
        }

        areaService.delete(id);
        return ApiResponse.success();
    }

    /**
     * 获取区域的设备数量
     * 
     * @param id 区域ID
     * @return 设备数量
     */
    @GetMapping("/{id}/device-count")
    public ApiResponse<Map<String, Integer>> countDevices(@PathVariable Long id) {
        // 检查区域是否存在
        Area area = areaService.getById(id);
        if (area == null) {
            throw new NoSuchElementException("区域不存在");
        }

        int count = areaService.countDevices(id);
        Map<String, Integer> result = new HashMap<>();
        result.put("count", count);
        return ApiResponse.success(result);
    }
}